CORS (Cross-Origin Resource Sharing) হল একটি নিরাপত্তা বৈশিষ্ট্য যা ব্রাউজারকে এক ডোমেইনের ওয়েব পেজ থেকে অন্য ডোমেইনের রিসোর্স অ্যাক্সেস করার অনুমতি দেয়। এটি নিরাপত্তার জন্য ব্যবহৃত হয় এবং একাধিক ডোমেইন থেকে রিসোর্স অ্যাক্সেস সীমিত করার জন্য ব্রাউজার কর্তৃক প্রয়োগ করা হয়।
যেমন, যদি আপনার Frontend অ্যাপ্লিকেশন একটি ডোমেইনে থাকে এবং Backend অন্য ডোমেইনে চলে, তাহলে CORS প্রসেসের মাধ্যমে আপনার Backend API-র রিসোর্স Frontend-কে অ্যাক্সেস করতে অনুমতি দেয়।
Spring Security তে CORS Management
Spring Security তে CORS কনফিগার করার জন্য আপনাকে HttpSecurity কনফিগারেশনের মধ্যে cors() ফাংশন ব্যবহার করতে হয়। Spring Boot-এ CORS কনফিগারেশন বেশ সহজ এবং এটি অনেক ধরণের কনফিগারেশন প্রদান করে।
CORS কনফিগারেশন পদ্ধতি
Spring Security তে CORS কনফিগার করার জন্য কিছু সাধারণ উপায় রয়েছে:
- Global CORS Configuration (অ্যাপ্লিকেশন সবার জন্য CORS কনফিগারেশন)
- Controller-Level CORS Configuration (নির্দিষ্ট কন্ট্রোলারের জন্য CORS কনফিগারেশন)
1. Global CORS Configuration
Global CORS Configuration ব্যবহার করে পুরো অ্যাপ্লিকেশনের জন্য CORS পলিসি সেট করা হয়।
Global CORS Configuration উদাহরণ:
WebConfig.java বা SecurityConfig.java ক্লাসে CORS কনফিগারেশন করা যেতে পারে:
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.CorsRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
@Configuration
public class WebConfig implements WebMvcConfigurer {
@Override
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping("/**") // Allow CORS on all endpoints
.allowedOrigins("http://localhost:3000", "http://example.com") // Allow specific origins
.allowedMethods("GET", "POST", "PUT", "DELETE") // Allowed HTTP methods
.allowedHeaders("Authorization", "Content-Type") // Allowed headers
.allowCredentials(true); // Allow cookies
}
}
Explanation:
addMapping("/**"): সমস্ত এন্ডপয়েন্টে CORS অনুমতি দেওয়া হচ্ছে।allowedOrigins("http://localhost:3000"): যেই Origins থেকে রিকোয়েস্ট আসবে সেগুলোকে অনুমতি দেওয়া হয়েছে। এটি সাধারণত Frontend অ্যাপ্লিকেশনের URL হয়।allowedMethods(...): যেই HTTP মেথডগুলো অনুমোদিত হবে।allowedHeaders(...): রিকোয়েস্ট হেডারগুলোর অনুমতি দেওয়ার জন্য।allowCredentials(true): ব্রাউজারের সাথে ক্রেডেনশিয়ালস (যেমন কুকিজ) পাঠানোর অনুমতি দেওয়া হয়।
2. Controller-Level CORS Configuration
এটি নির্দিষ্ট কন্ট্রোলার বা মেথডের জন্য CORS কনফিগারেশন দেয়। যদি আপনি কেবল নির্দিষ্ট কন্ট্রোলারের জন্য CORS কনফিগারেশন করতে চান তবে আপনি @CrossOrigin অ্যানোটেশন ব্যবহার করতে পারেন।
Controller-Level CORS Configuration উদাহরণ:
import org.springframework.web.bind.annotation.CrossOrigin;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@CrossOrigin(origins = "http://localhost:3000") // Specific CORS Configuration
public class MyController {
@GetMapping("/api/data")
public String getData() {
return "CORS enabled for this endpoint!";
}
}
Explanation:
@CrossOrigin(origins = "http://localhost:3000"): এই কন্ট্রোলার এবং এর সমস্ত মেথডের জন্য CORS কনফিগারেশন দেয়া হয়েছে। এখানে শুধু নির্দিষ্ট একটি Origin-কে অনুমতি দেওয়া হয়েছে।
3. Spring Security CORS Configuration
Spring Security-তে CORS কনফিগারেশন করার জন্য HttpSecurity-তে cors() ফাংশন ব্যবহার করা হয়।
Spring Security CORS Configuration উদাহরণ:
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.web.SecurityFilterChain;
@Configuration
public class SecurityConfig {
@Bean
public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
http
.csrf().disable() // Disable CSRF if needed (For stateless API)
.cors().and() // Enable CORS support
.authorizeHttpRequests(auth -> auth
.requestMatchers("/api/**").permitAll() // Allow access to /api/**
.anyRequest().authenticated() // Other requests need authentication
);
return http.build();
}
}
Explanation:
cors().and(): এখানে Spring Security-তে CORS কনফিগারেশন সক্রিয় করা হয়েছে। এটিWebMvcConfigurerদ্বারা কনফিগার করা@Configurationক্লাসের CORS কনফিগারেশন ব্যবহার করবে।csrf().disable(): যদি এটি stateless অ্যাপ্লিকেশন হয়, যেমন REST API, তাহলে CSRF নিরাপত্তা নিষ্ক্রিয় করা যেতে পারে।
4. CORS এবং Credentials (Cookies)
Credentials (যেমন, কুকি বা HTTP Authentication Header) পাঠানোর সময় CORS পলিসির কিছু অতিরিক্ত কনফিগারেশন প্রয়োজন হতে পারে।
Example:
@Configuration
public class WebConfig implements WebMvcConfigurer {
@Override
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping("/**")
.allowedOrigins("http://localhost:3000")
.allowedMethods("GET", "POST", "PUT", "DELETE")
.allowedHeaders("Authorization", "Content-Type")
.allowCredentials(true); // Enable sending credentials (cookies)
}
}
Explanation:
allowCredentials(true): যদি আপনি ব্রাউজার থেকে কুকি বা অন্যান্য ক্রেডেনশিয়ালস পাঠাতে চান, তবে আপনাকে এই কনফিগারেশনটি করতে হবে। CORS কনফিগারেশনে এটিtrueকরতে হবে এবংallowedOrigins()সঠিকভাবে কনফিগার করতে হবে।
CORS Error Handling
যদি CORS পলিসি সঠিকভাবে কনফিগার না করা হয়, তবে আপনি ব্রাউজারে নিম্নলিখিত ত্রুটি দেখতে পারেন:
Access to XMLHttpRequest at 'http://localhost:8080/api/data' from origin 'http://localhost:3000' has been blocked by CORS policy
এটি সাধারণত CORS কনফিগারেশন সঠিকভাবে না করা হলে ঘটে। এই ধরনের সমস্যা এড়াতে, আপনি নিশ্চিত করুন যে:
allowedOrigins()সঠিকভাবে কনফিগার করা হয়েছে।allowedMethods()সঠিক HTTP মেথডগুলোর অনুমতি দেওয়া হয়েছে।allowCredentials(true)সঠিকভাবে সেট করা হয়েছে যদি আপনার অ্যাপ্লিকেশন কুকি ব্যবহার করে।
উপসংহার:
Spring Security তে CORS কনফিগারেশন অত্যন্ত গুরুত্বপূর্ণ, বিশেষত যদি আপনার অ্যাপ্লিকেশন বিভিন্ন ডোমেইনে কাজ করে। আপনি CORS কনফিগারেশন Global বা Controller-level এ করতে পারেন, এবং Spring Security-তে এটি খুব সহজে ইন্টিগ্রেট করা যায়। CORS এর মাধ্যমে আপনি নিরাপদে আপনার ফ্রন্টএন্ড এবং ব্যাকএন্ড অ্যাপ্লিকেশনের মধ্যে যোগাযোগ নিশ্চিত করতে পারবেন।
Read more